home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
language
/
turboass.lzh
/
LIBRARYS
/
AES_VDI.S
next >
Wrap
Text File
|
1986-02-06
|
14KB
|
369 lines
;************************************************************************
;* Σ-soft-AES/VDI-Binding *
;* ©1989 by Σ-soft, written by Markus Fritze 05.12.1989 14:40 *
;************************************************************************
TEXT
gem_init: movea.l 4(SP),A6 ;Basepageadresse holen
movea.w #$0100+$0400,A5 ;Größe der Basepage + Stackgröße (1k)
adda.l 12(A6),A5 ;+ Größe des TEXT-Segments
adda.l 20(A6),A5 ;+ Größe des DATA-Segments
adda.l 28(A6),A5 ;+ Größe des BSS-Segments
move.l A5,D1 ;= Gesamtlänge des Programms
andi.w #$FFFE,D1 ;Länge nun gerade
add.l A6,D1 ;+ Programmstart (Basepageadresse)
movea.l D1,SP ;Stack endet dort
move.l A5,-(SP) ;Programmlänge
move.l A6,-(SP) ;Adresse der Basepage
move.l #$4A0000,-(SP) ;Funktionsnummer + Dummyword (0)
trap #1 ;Mshrink(0,Basepageadr,Prglänge)
lea 12(SP),SP ;Nur noch den Stack korrigieren
;Das war schon alles. In A6 befindet sich noch die Basepageadresse und in a5
;liegt die totale Programmlänge (TRAP #1 zerstört D0-D2 und A0-A2!)
move.l #appl_init,D0
bsr aes ;Programm als GEM-Applikation anmelden
move.w D0,gl_apid
move.l #graf_handle,D0
bsr aes ;Handle der Bildschirm-Workstation ermitteln
move.w D0,gr_handle
lea intin(PC),A4 ;VDI-Intin-Array (war früher falsch!)
moveq #10,D0
gem_in1: move.w #1,(A4)+
dbra D0,gem_in1
addq.w #1,-(A4)
moveq #100,D0
moveq #$0B,D1
lsl.w #8,D1
bsr vdi ;v_opnvwk() - Workstation öffnen
move.w int_in+10(PC),gr_handle ;VDI-Handle neu merken
;************************************************************************
;* Ab hier liegt das eigene Programm *
;************************************************************************
;************************************************************************
;* Programm beenden *
;************************************************************************
gem_exit: moveq #101,D0
moveq #0,D1
bsr.s vdi ;v_clsvwk() - Workstation schliessen
move.l #appl_exit,D0
bsr.s aes ;Applikation wieder abmelden
clr.w -(SP)
trap #1 ;und verlassen mit Pterm0()
;************************************************************************
;* Mein eigener kleiner AES-Aufruf *
;* D0=Die ersten 4 Einträge im contrl-Array (Bytebreite!) *
;* Bit 24-31 = Der Opcode bzw. die Funktionsnummer *
;* Bit 16-23 = Anzahl der Einträge in int_in *
;* Bit 8-15 = Anzahl der Einträge in int_out *
;* Bit 0-7 = Anzahl der Einträge in addr_in *
;* Die Anzahl der Einträge in addr_out ist stets 0. *
;* Ausnahme:Bei rsrc_gaddr() dort sollte dort eine 1 stehen (Atari hält *
;* sich allersdings selbst nicht dran) *
;************************************************************************
aes: movem.l D1-A6,-(SP) ;besser retten, man kann nie wissen
lea control(PC),A0
clr.l (A0)
clr.l 4(A0) ;contrl-Array löschen
movep.l D0,1(A0) ;und die neuen Daten eintragen
lea aes_pb(PC),A0
move.l A0,D1
move.w #$C8,D0
trap #2 ;AES aufrufen
moveq #0,D0
move.w int_out(PC),D0
movem.l (SP)+,D1-A6
rts
;************************************************************************
;* Und das gleiche nochmal für die VDI-Funktionen *
;* D0 = Opcode bzw. die Funktionsnummer *
;* D1 = Die Parameter (Bytebreite!) *
;* Bit 24-31 = Anzahl der Einträge in ptsin *
;* Bit 16-23 = Anzahl der Einträge in ptsout *
;* Bit 8-15 = Anzahl der Einträge in intin *
;* Bit 0-7 = Anzahl der Einträge in intout *
;* Die Gerätekennung wird der Variable "gr_handle" entnommen. *
;************************************************************************
vdi: movem.l D2-A6,-(SP)
lea contrl(PC),A3
move.w D0,(A3)+
clr.l (A3)+
clr.l (A3)+
movep.l D1,-7(A3)
move.w gr_handle(PC),2(A3)
lea vdi_pb(PC),A0
move.l A0,D1
moveq #$73,D0
trap #2
movem.l (SP)+,D2-A6
rts
;************************************************************************
;* Nun folgt noch der DATA-Bereich *
;************************************************************************
DATA
aes_pb: DC.L control ;Der AES-Parameterblock
DC.L global
DC.L int_in
DC.L int_out
DC.L addr_in
DC.L addr_out
vdi_pb: DC.L contrl ;Der VDI-Parameterblock
DC.L intin
DC.L ptsin
DC.L intout
DC.L ptsout
;************************************************************************
;* und noch ein wenig BSS-Bereich *
;************************************************************************
BSS
contrl: DS.W 11 ;Die VDI-Variablen
intin: DS.W 128
intout: DS.W 128
ptsin: DS.W 128
ptsout: DS.W 128
control: DS.W 5 ;Die AES-Variablen
global: DS.W 15
int_in: DS.W 16
int_out: DS.W 7
addr_in: DS.L 3
addr_out: DS.L 1
gl_apid: DS.W 1 ;ID der Applikation
gr_handle: DS.W 1 ;Die Handle der Bildschirm-Workstation (graf_handle)
;EQU's mit Konstanten sind auch als Vorwärtsreferenzen möglich, da diese Symbole
;ihren Wert bereits bei der Eingabe erhalten:
appl_init: EQU $0A000100
appl_read: EQU $0B020101
appl_write: EQU $0C020101
appl_find: EQU $0D000101
appl_tplay: EQU $0E020101
appl_trecord: EQU $0F010101
appl_bvset: EQU $10020100 ;ab GEM 2.0
appl_yield: EQU $11000100 ;ab GEM 2.0
appl_exit: EQU $13000100
evnt_keybd: EQU $14000100
evnt_button: EQU $15030500
evnt_mouse: EQU $16050500
evnt_mesag: EQU $17000101
evnt_timer: EQU $18020100
evnt_multi: EQU $19100701
evnt_dclick: EQU $1A020100
menu_bar: EQU $1E010101
menu_icheck: EQU $1F020101
menu_ienable: EQU $20020101
menu_tnormal: EQU $21020101
menu_text: EQU $22010102
menu_register: EQU $23010101
menu_unregister:EQU $24010100 ;ab GEM 2.0
objc_add: EQU $28020101
objc_delete: EQU $29010101
objc_draw: EQU $2A060101
objc_find: EQU $2B040101
objc_offset: EQU $2C010301
objc_order: EQU $2D020101
objc_edit: EQU $2E040201
objc_change: EQU $2F080101
form_do: EQU $32010101
form_dial: EQU $33090100
form_alert: EQU $34010101
for